package main

import (
	"fmt"
	"io/ioutil"
)

//文件复制 缓冲区越大，复制速度越快
/*
	流程:
	1.指定源文件与目标文件
	2.进行源文件读操作，读到切片中
	3.进行目标文件写操作
	4.关闭文件
*/
/*  方法1--采用IO包下的Read()和Write()方法实现
func copyfile(src, dest string) (int, error) {
	file, err := os.Open(src)
	if err != nil {
		return 0, err
	}
	file2, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE|os.O_APPEND, os.ModePerm)
	if err != nil {
		return 0, err
	}
	defer file.Close()
	defer file2.Close()
	//	读写操作
	b := make([]byte, 1024)
	n := -1 //读取的数据量
	total := 0
	for {
		n, err = file.Read(b)
		if err == io.EOF || n == 0 {
			fmt.Println("读数据完成")
			break
		} else if err != nil {
			fmt.Println("读文件报错")
			return total, err
		}
		total += n
		file2.Write(b[:n]) //将读取到的数据量写入到切片中
	}
	return total, nil
}
*/
/*
//方法2 --采用io包下的Copy方法实现复制文件
func copyfile(src, dest string) (int64, error) {
	//1.打开源文件
	readsrcfile, err := os.Open(src)
	if err != nil {
		fmt.Println("读文件失败")
	}
	//创建源文件的缓冲读取器
	reader := bufio.NewReader(readsrcfile)

	//2.打开或创建目标文件
	writedestfile, err := os.OpenFile(dest, os.O_CREATE|os.O_WRONLY|os.O_APPEND, os.ModePerm)
	if err != nil {
		fmt.Printf("写文件失败，err：%v\n", err)
		return 1, err
	}
	defer readsrcfile.Close()
	defer writedestfile.Close()
	// 创建目标文件的缓冲写入器
	writer := bufio.NewWriter(writedestfile)
	// 采用io.Copy()进行文件拷贝
	return io.Copy(writer, reader)
}
*/
//方法3 --采用ioutil包下的ReadFile()和WriteFile()方法实现
//虽然这种方法能够实现文件复制，但它在复制大文件时的效率可能不高。这是因为当文件很大时，ioutil.ReadFile() 返回的字节切片会很大
func copyfile(src, dest string) (int, error) {
	//1.一次性读取文件中的数据
	ret, err := ioutil.ReadFile(src)
	if err != nil {
		fmt.Printf("read file failed,err:%v", err)
		return 1, err
	}
	// 2.将源文件中的数据写入到目标文件中
	err = ioutil.WriteFile(dest, ret, 0777)
	if err != nil {
		fmt.Printf("Error opening file %v\n", err)
		return 1, err
	} else {
		fmt.Printf("文件复制完成")
	}
	return len(ret), nil
}
func main() {
	src := "D:\\go\\src\\code.oldboyedu.com\\studygo\\day05\\08文件操作\\1.txt"
	dest := "./3.txt"
	copyfile(src, dest)
}
